#ifndef __DATABASE_H__
#define __DATABASE_H__
#include <iostream>
#include <mysql/mysql.h>
#include <string>
#include <stdio.h>
#include <random>
#include <string.h>
#include <vector>
#include <sstream>
#include <jsoncpp/json/json.h>
#include <cstdlib>
#include "config.h"

using namespace std;

class ChatDatabase
{
private:
    MYSQL *mysql;
    //
    User *userinfo;
    // 随机生成11位账号
    void make_uid(string &);
    // sql语句执行函数
    static MYSQL_RES *get_MYSQL_RES(MYSQL *mysql, const char *sqlscript);
    // 密码加密
    // string ChatDatabase::strEncrypt(const string &);
    static ChatDatabase *instance;

public:
    ChatDatabase(/* args */);
    ~ChatDatabase();
    //  单例
    static ChatDatabase *getChatDatabase();
    // 连接数据库
    void my_database_connect();
    // 获取一行或多行查询结果, 单行或单列返回1,多行多列返回2, 无数据返回0
    int my_database_get_data(vector<string> &array, const char *sqlscript);
    // 根据账号返回id
    int getid(const char *loginid);
    // 根据id返回账号
    char *getlogin(int id);
    // 断开数据库连接
    void my_database_disconnect() { mysql_close(this->mysql); }
    // 注册业务实现
    //  参数为昵称和密码    账号自分配
    // 成功 返回    账号
    // 失败 返回-1
    string my_database_user_register(const string &name, const string &password);
    // 查找用户是否存在, 如果存在返回ture,通过参数返回用户uid
    bool my_database_user_exist(const string &);
    // 用户登录密码验证业务
    // 失败 返回-1
    // 成功 返回0
    // 密码错误 返回1
    // 用户不存在 返回2
    int my_database_user_confirm(const string &loginid, const string &password);
    // 通过账号获得用户信息结构体
    //  查一条
    // 成功 返回结构体指针
    // 失败 返回nullper
    User *my_database_user_getmessage(const string &loginid);
    //  将用户信息填入数据库
    //  写一条
    // 成功 返回 0
    int my_database_user_setmessage(const User &);
    //  查询用户状态
    //  1 为在线 ,2 为离线  -1查询失败
    int my_database_user_setstate(const string &loginid);
    //  更改用户状态
    //  执行成功 0 ，失败 1
    //  flag 为1 在线
    //  flag 为2 离线
    int my_database_user_getstate(const string &loginid, int flag);
    // 添加消息
    void my_database_write_offlineMsg(const Json::Value &val);
    // 读出消息
    int my_database_read_offlineMsg(vector<string> &, string);

    //  根据昵称模糊查找 用户
    //  返回用户数组
    vector<User> my_database_user_find(const string &nickname);

    //  获取用户好友
    //  返回好友map
    //  键：好友的用户名，值：好友的Friends结构体
    map<const string, Friends> my_database_getfriends(const string &);
    //  添加好友
    // 成功 1，失败 0
    int my_newfriend(const newFriends &);
    // 读出数据库的好友申请
    //  返回
    //  好友验证接收者收
    vector<newFriends> my_getnewfriends(const string &);
    //  添加好友
    //  简单版
    //  成功 1，失败 0
    int add_friend(const string &, const string &, const string &, const string &);
};
#endif